#!/usr/bin/env python
# -*- coding:utf-8 -*-

# 计算1-100的整数之和,range(101)可生成一个整数序列
"""
sum = 0
for x in range(101):
    sum = sum + x
print(sum)

# while循环
sum = 0
n = 99
while n > 0:
    sum = sum + n
    n = n - 2
print(sum)
# 在循环内部变量n不断自减,直到变为-1时,不再满足while条件.
"""

"""
import math

def move(x,y,step,angle=0):
    nx = x + step * math.cos(angle)
    ny = y - step * math.sin(angle)
    return nx,ny


x,y = move(100,100,60,math.pi / 6)
print(x,y)
"""


# 位置参数
# 修改后的power函数,可以计算任意n次方.
"""
def power(x,n):  # x和n这两个参数都是位置参数.
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

a = power(5,2)
print(a)
"""



# 可变参数
"""
def calc(*number): # 定义可变参数,在参数前面加*号.
    sum = 0
    for n in number:
        sum = sum + n * n
    return sum

print(calc(1,2))

# 把list或tuple的元素变成可变参数传入:
num = [1,2,3]
print(calc(*num)) # *num表示把num这个list的所有元素作为可变参数传进去.
"""


# 关键字参数
"""
def person(name,age,**kw):
    print('name:',name,'age:',age,'other:',kw)

# 调用函数时,只传入必选参数
person('Michael',30)

# 传入任意个数的关键字参数
person('Bob',35,city='Beijing')
person('Adam',45,gender='M',job='Engineer')
"""


# 命名关键字参数
# 只接收city和job作为关键字参数
"""
def person(name,age,*,city,job):
    print(name,age,city,job)

# 调用方式
person('Jack',24,city='Beijing',job='Engineer')
"""


# 命名关键字参数可以有默认值,从而简化调用.
"""
def person(name,age,*,city='Beijing',job):
    print(name,age,city,job)
# 命名关键字参数city具有默认值,调用时,可不传入city参数.
person('Jack',24,job='Engineer')
"""


"""
def f1(a,b,c=0,*args,**kw):
    print('a=',a,'b=',b,'c=',c,'args=',args,'kw=',kw)

def f2(a,b,c=0,*,d,**kw):
    print('a=',a,'b=',b,'c=',c,'d=',d,'kw=',kw)
    
# 函数调用时,python会自动按照参数位置和参数名把对应的参数传入.
f1(1,2)
print('=='*20)
f1(1,2,c=3)
print('=='*10)
f1(1,2,3,'a','b')
print('--'*20)
f1(1,2,3,'a','b',x=99)
print('--'*10)
f2(1,2,d=99,ext=None)
print('---'*5)

# 通过一个tuple和dict，也可以调用上述函数
args = (1,2,3,4)
kw = {'d': 99,'x': '#'}
f1(*args,**kw)
print('+'*20)
args = (1,2,3)
kw = {'d': 88,'x': '#'}
f2(*args,**kw)

"""



# 递归函数
"""
def fact(n):
    if n==1:
        return 1
    return n * fact(n - 1)

print(fact(10))
print(fact(15))
print(fact(100))
"""


def fact(n):
    return fact_iter(n,1)

def fact_iter(num,product):
    if num == 1:
        return product
    return fact_iter(num - 1,num * product) # 仅返回递归函数本身.

print(fact_iter(5,1))
print(fact_iter(2,60))
